home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1996 / MacHack 1996.toast / Presentations / Presentations ’96 / Papers ’96 / Standard Template Library / Demo / macString.cp < prev    next >
Encoding:
Text File  |  1996-06-21  |  4.0 KB  |  146 lines  |  [TEXT/SPM ]

  1. #define OLDROUTINELOCATIONS 0
  2. #include <ConditionalMacros.h>
  3. #include <TextUtils.h> // For c2pstr
  4. #include <PLStringFuncs.h> // For PLstrcpy
  5.  
  6. #include <assert.h>
  7. #include <iostream.h>
  8. #include <stl.h>
  9.  
  10. // This is the Symantec C++ 8.1 way to instantiate templates.  Don't forget the ';' on the end of the line
  11. template class vector<char>;
  12. // template class rb_tree<macString,pair<const macString,macString>,select1st<pair<const macString,macString>,macString>,less<macString>>;
  13. template void uninitialized_fill_n(char *,unsigned int,const char&);
  14. template char *uninitialized_copy(char *,char *,char *);
  15. template char *copy_backward(char *,char *,char *);
  16. template char *copy(const char *,const char *,char *);
  17. template char *uninitialized_copy(const char *,const char *,char *);
  18. template void fill_all(char *,char *,const char&);
  19. template void __distance(rb_tree<macString,pair<const macString,macString>,select1st<pair<const macString,macString>,macString>,less<macString>>::const_iterator,rb_tree<macString,pair<const macString,macString>,select1st<pair<const macString,macString>,macString>,less<macString>>::const_iterator,unsigned int&,bidirectional_iterator_tag);
  20. template void __distance(rb_tree<macString,pair<const macString,macString>,select1st<pair<const macString,macString>,macString>,less<macString>>::iterator,rb_tree<macString,pair<const macString,macString>,select1st<pair<const macString,macString>,macString>,less<macString>>::iterator,unsigned int&,bidirectional_iterator_tag);
  21. template char *copy(char *,char *,char *);
  22. template insert_iterator<vector<char>> copy(const char *,const char *,insert_iterator<vector<char>>);
  23. template insert_iterator<vector<char>> copy(char *,char *,insert_iterator<vector<char>>);
  24.  
  25. #include "macString.h"
  26.  
  27. #define VERBOSE 0
  28.  
  29. macString::macString(
  30.     const macString& ms)
  31.     : bCStrOK(true), bPStrOK(false), s(256)
  32. {
  33.     macString &msIn = (macString)ms;
  34.     msIn.synchronize();
  35.     s = ms.s;
  36.     synchronize();
  37. }
  38.  
  39. macString::macString(
  40.     const char *sIn)
  41.     : bCStrOK(true), bPStrOK(false), s(256)
  42. {
  43.     s.reserve(strlen(sIn) + 1);
  44.     strcpy(s.begin(), sIn);
  45.     synchronize();
  46. }
  47.  
  48. macString::macString(
  49.     const unsigned char *sIn)
  50.     : bCStrOK(false), bPStrOK(true), s(256)
  51. {
  52.     PLstrcpy(str255, sIn);
  53.     synchronize();
  54. }
  55.  
  56. const char* macString::conststr() const
  57. {
  58.     macString& ms = (macString)*this;
  59.     ms.synchronize();
  60.     return s.begin();
  61. }
  62.  
  63. const unsigned char* macString::constpstr()
  64. {
  65.     macString& ms = (macString)*this;
  66.     ms.synchronize();
  67.     return str255;
  68. }
  69.  
  70. void macString::synchronize()
  71. {
  72.     assert(bCStrOK || bPStrOK);
  73.     assert(s.capacity() >= 256);
  74.     if (!bCStrOK)
  75.     {
  76.         PLstrcpy((unsigned char *)s.begin(), str255);
  77.         p2cstr((unsigned char *)s.begin());
  78.         bCStrOK = true;
  79.     }
  80.     if (!bPStrOK)
  81.     {
  82.         strncpy((char *)str255, s.begin(), 255);
  83.         c2pstr((char *)str255);
  84.         bPStrOK = true;
  85.     }
  86. }
  87.  
  88. void macString::dump(void)
  89. {
  90.     assert(bCStrOK || bPStrOK);
  91.     assert(s.capacity() >= 256);
  92.     cout << "in macString::dump" << endl;
  93.     cout << "                this = " << this << endl;
  94.     cout << "        s.capacity() = " << s.capacity() << endl;
  95.     // cout << "           s.begin() = " << (void *)s.begin() << endl;
  96.     // cout << "             s.end() = " << (void *)s.end() << endl;
  97.     // cout << "            s.size() = " << s.size() << endl;
  98.     // cout << " s.end() - s.begin() = " << s.end() - s.begin() << endl;
  99.     cout << "   strlen(s.begin()) = " << strlen(s.begin()) << endl;
  100.     cout << "-->" << *this << "<--" << endl;
  101. }
  102.  
  103. macString& macString::operator+=(const macString &msc)
  104. {
  105.     size_t len;
  106.     
  107.     synchronize();
  108.     macString& ms = (macString)msc;
  109.     ms.synchronize();
  110.     len = strlen(s.begin()) + strlen(ms.s.begin()) + 1;
  111.     s.reserve(len);
  112.     strcat(s.begin(), ms.s.begin());
  113.     bPStrOK = false;
  114.     synchronize();
  115.     return *this;
  116. }
  117.  
  118. macString operator+ (
  119.     macString& ms0,
  120.     macString& ms1)
  121. {
  122.     ms0.synchronize();
  123.     ms1.synchronize();
  124.     macString ms(ms0);
  125.     ms += ms1;
  126.     return ms;
  127. }
  128.  
  129. char* macString::str()
  130. {
  131.     synchronize();
  132.     bCStrOK = false;
  133.     return s.begin();
  134. }
  135.  
  136. macString& macString::operator=(const macString &mscIn)
  137. {
  138.     macString& msIn = (macString)mscIn;
  139.     msIn.synchronize();
  140.     s = msIn.s;
  141.     bCStrOK = true;
  142.     bPStrOK = false;
  143.     synchronize();
  144.     return *this;
  145. }
  146.